package cn.edu.scau.cmi.yanghaorui.client;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
import java.util.Set;

import org.hibernate.Transaction;

import cn.edu.scau.cmi.yanghaorui.hibernate.dao.StudentDAO;
import cn.edu.scau.cmi.yanghaorui.hibernate.dao.TeacherDAO;
import cn.edu.scau.cmi.yanghaorui.hibernate.domain.Student;
import cn.edu.scau.cmi.yanghaorui.hibernate.domain.Teacher;
import cn.edu.scau.cmi.yanghaorui.simpleFactoryMethod.MeatFactory;
import cn.edu.scau.cmi.yanghaorui.simpleFactoryMethod.domain.Meat;

public class HibernateClient {

	public static void main(String[] args) {
		char c = '0';		
		//Scanner sc = new Scanner(System.in);  
		while(true) {
			System.out.println("请输入您想要进行的操作:1.添加学生 2.删除学生3.查找学生4.选择指导老师  5.修改指导老师");
			System.out.println("请输入您想要进行的操作:a.添加老师 b.删除老师c.查找老师d.选择/修改被指导学生e.删除被指导学生 0.退出");
			Scanner sc = new Scanner(System.in);
			c =sc.next().charAt(0);    
			if(c=='1') {
				System.out.println("添加学生：");
                System.out.println("请输入添加学生的姓名：");
                String stu_name = sc.next();
                
                System.out.println("请输入添加学生的学号：");
                java.lang.Long stu_id = sc.nextLong();
                
				Student t=new Student();
				t.setName(stu_name);
				t.setId(stu_id);
				newStudent(t);
				System.out.println("添加学生成功！！！！！\n");
				//listStudents();
				
				//String productType = scanner.next();
			}
			else if(c=='2') {
				System.out.println("请输入删除学生的学号：");
                java.lang.Long stu_id = sc.nextLong();
                deleteStudent(stu_id);
                System.out.println("删除学生成功！！！！！\n");
			}
			else if(c=='3') {
				System.out.println("请输入想查找学生的学号：");
                java.lang.Long stu_id = sc.nextLong();
                findStudent(stu_id).show();
               // stu_id.show();
                System.out.println("查找学生成功！！！！！\n");
				
			}
			else if(c=='4'){
				System.out.println("请输入想选择导师的学生的学号：");
                java.lang.Long stu_id = sc.nextLong();
                
                System.out.println("<<<<<导师名单>>>>>");
                listTutors();
                System.out.println("<<<<<导师名单>>>>>");
                
                System.out.println("请输入选择导师的工号：");
                java.lang.Long teach_id = sc.nextLong();
				updateStudent_instructor(stu_id,teach_id);
				System.out.println("选择导师成功！！！！！\n");
				//listStudents();
				
			}
			else if(c=='5'){
				System.out.println("请输入想修改导师的学生的学号：");
                java.lang.Long stu_id = sc.nextLong();
                
                System.out.println("<<<<<导师名单>>>>>");
                listTutors();
                System.out.println("<<<<<导师名单>>>>>");
                
                System.out.println("请输入选择导师的工号：");
                java.lang.Long teach_id = sc.nextLong();
				updateStudent_instructor(stu_id,teach_id);
				System.out.println("修改导师成功！！！！！\n");
				//listStudents();
				
			}
            else if(c=='a'){
            	//System.out.println("添加老师：");
                System.out.println("请输入添加老师的姓名：");
                String teach_name = sc.next();
                
                System.out.println("请输入添加老师的工号：");
                java.lang.Long teach_id = sc.nextLong();
                
				Teacher t=new Teacher();
				t.setName(teach_name);
				t.setId(teach_id);
				newTeacher(t);
				System.out.println("添加老师成功！！！！！\n");
				//listTutor();
			}
            else if(c=='b'){
            	System.out.println("请输入删除老师的工号：");
                java.lang.Long teach_id = sc.nextLong();
                deleteTeacher(teach_id);
                System.out.println("删除老师成功！！！！！\n");
			}
            else if(c=='c'){
            	System.out.println("请输入想查找老师的工号：");
                java.lang.Long teach_id = sc.nextLong();
                findTeacher(teach_id).show();
               // stu_id.show();
                System.out.println("查找老师成功！！！！！\n");
			}
            else if(c=='d'){
            	System.out.println("请输入想选择学生的老师的工号：");
                java.lang.Long teach_id = sc.nextLong();
                
                System.out.println("<<<<<学生名单>>>>>");
                listStudents();
                System.out.println("<<<<<学生名单>>>>>");
                
                System.out.println("请输入选择学生的学号：");
                java.lang.Long stu_id = sc.nextLong();
				addInstructor_student(teach_id,stu_id);
				System.out.println("选择学生成功！！！！！\n");
	
            }
            else if(c=='e'){
            	System.out.println("请输入想删除学生的老师的工号：");
                java.lang.Long teach_id = sc.nextLong();
                
                System.out.println("<<<<<学生名单>>>>>");
                listStudents();
                System.out.println("<<<<<学生名单>>>>>");
                
                System.out.println("请输入想解除指导关系学生的学号：");
                java.lang.Long stu_id = sc.nextLong();
				deleteInstructor_student(teach_id,stu_id);
				System.out.println("解除指导关系成功！！！！！\n");
            }
            else if(c=='0'){
            	System.out.println("<<<<<学生列表>>>>>");
            	listStudents();
            	System.out.println("<<<<<学生列表>>>>>");
            	
            	System.out.println("<<<<<导师列表>>>>>");
            	listTutors();
            	System.out.println("<<<<<导师列表>>>>>");
	             return ;
            }
			else {
				System.out.println("无效输入，请重新输入！");
			}
		}
		// TODO Auto-generated method stub
		/*Student stu=new Student();
		stu.setName("zhangsan");
		stu.setId(2L);*/
		//listStudents();
		/*
		System.out.println("现有学生：");
		Student s=findStudent(2L);
		s.show();
		Teacher t=new Teacher();
		Teacher t2=new Teacher();
		t.setId(2017L);
		t.setName("miss A");
		t2.setId(2018L);
		t2.setName("miss B");
		newTeacher(t);
		newTeacher(t2);
		System.out.println("现有老师：");
		listTutor();
		System.out.println("选择导师：");
		updateStudent_instructor(2L,3L);
		s.show();
		System.out.println("更换导师：");
		updateStudent_instructor(2L,4L);
		s.show();
		*/
		/*Teacher t=findTeacher(10L);
		 addInstructor_student(10L,2L);
		listStudents();*/
		//deleteTeacher(1L);
		//deleteTeacher(2L);
		//listTutor();
       /* deleteStudent(1L);*/
		//newStudent(stu);
       /* listStudents();*/
		//listTutor();
        /*s.show()
         * 把展示学生信息放在主函数
         * 
         */
		/*Teacher t=new Teacher();
		Teacher t2=new Teacher();
		t.setId(2017L);
		t.setName("miss C");
		t2.setId(2018L);
		t2.setName("miss D");
		newTeacher(t);
		newTeacher(t2);
		System.out.println("现有老师：");
		listTutor();*/

	}
	//增加学生
	public static void newStudent(Student stu) {
		//Student stu=findStudent(id);
		StudentDAO stuDAO=new StudentDAO();
//		要将数据保存到数据库，或者使用transaction，或者使用session的fulsh方法
		Transaction transaction = StudentDAO.getSession().beginTransaction();
		stuDAO.save(stu);
		transaction.commit();
//		(3) 或者不适用事务，使用flush从缓冲区中将数据持久化到数据库中
//		majorDAO.getSession().flush();
	}
	//删除学生
	public static void deleteStudent(java.lang.Long id) {
		Student stu=findStudent(id);
		StudentDAO stuDAO=new StudentDAO();
//		要将数据保存到数据库，或者使用transaction，或者使用session的fulsh方法
		Transaction transaction = StudentDAO.getSession().beginTransaction();
		stuDAO.delete(stu);
		transaction.commit();
//		(3) 或者不适用事务，使用flush从缓冲区中将数据持久化到数据库中
//		majorDAO.getSession().flush();
	}
	//查找学生，根据id
	public static Student findStudent(java.lang.Long id) {
		StudentDAO stuDAO=new StudentDAO();
//		要将数据保存到数据库，或者使用transaction，或者使用session的fulsh方法
		Transaction transaction = StudentDAO.getSession().beginTransaction();
		Student s=stuDAO.findById(id);
		transaction.commit();
		//s.show();放主函数里，因为别的函数调用不需要打印
		//System.out.println(s);
		return s;
	}
	//选择或者更新学生导师
	public static void updateStudent_instructor(java.lang.Long id,java.lang.Long id2) {
//需要修改信息的学生学号，以及将要选择老师的工号
		//listTutor();在主函数写
		
		TeacherDAO teachDAO=new TeacherDAO();
		Transaction transaction = TeacherDAO.getSession().beginTransaction();
		Teacher t=teachDAO.findById(id2);
		
		
//		要将数据保存到数据库，或者使用transaction，或者使用session的fulsh方法
		StudentDAO stuDAO=new StudentDAO();
		//Transaction transaction2 = StudentDAO.getSession().beginTransaction();
		Student s=stuDAO.findById(id);
		//System.out.print(s.toString());
		//if(t==null) {
			s.setTutor(t);
			//System.out.println("..............");
		//}
		
		//teachDAO.save(t);
		stuDAO.update(s);	
		Set<Student> ss=new HashSet<Student>();
		if(t.getStudents()!=null) {
			ss=t.getStudents();
		}
		//Set ss=t.getStudents();
		ss.add(s);
		  t.setStudents(ss);
		  teachDAO.update(t);
		  
		//transaction2.commit();
		transaction.commit();
		//System.out.println("选择/更新导师成功");
		
	}
    //导师列表
    public static void listTutor() {
	TeacherDAO teachDAO=new TeacherDAO();
	List t = teachDAO.findAll();
	Iterator<?> TeacherIterator = t.iterator();
	while(TeacherIterator.hasNext()){
		Teacher teacher = (Teacher) TeacherIterator.next();
		System.out.println("姓名:"+teacher.getName()+" 工号:"+teacher.getId());
	 }
    }
    public static void chooseTutor(java.lang.Long id) {
    	
    }
    private static void listStudents() {
    	StudentDAO stuDAO=new StudentDAO();
    	List stus = stuDAO.findAll();
    	Iterator<?> StudentIterator = stus.iterator();
    	while(StudentIterator.hasNext()){
    		Student stu = (Student) StudentIterator.next();
    		if(stu.getTutor()!=null) {
    			System.out.println("学生姓名:"+stu.getName()+" 学号:"+stu.getId()+" 导师:"+stu.getTutor().getName());
    		}
    		else {
    			System.out.println("学生姓名:"+stu.getName()+" 学号:"+stu.getId());
    		}
    		
    	}
    }
    //教师部分
    //增加导师
    public static void newTeacher(Teacher teach) {
		TeacherDAO teaDAO=new TeacherDAO();
//		要将数据保存到数据库，或者使用transaction，或者使用session的fulsh方法
		Transaction transaction = TeacherDAO.getSession().beginTransaction();
		teaDAO.save(teach);
		transaction.commit();
//		(3) 或者不适用事务，使用flush从缓冲区中将数据持久化到数据库中
//		majorDAO.getSession().flush();
	}
	//删除导师
	public static void deleteTeacher(java.lang.Long id) {
		Teacher teach=findTeacher(id);
		TeacherDAO teaDAO=new TeacherDAO();
//		要将数据保存到数据库，或者使用transaction，或者使用session的fulsh方法
		Transaction transaction = TeacherDAO.getSession().beginTransaction();
		teaDAO.delete(teach);
		transaction.commit();
//		(3) 或者不适用事务，使用flush从缓冲区中将数据持久化到数据库中
//		majorDAO.getSession().flush();
	}
	//查找老师，根据id
	public static Teacher findTeacher(java.lang.Long id) {
		TeacherDAO teaDAO=new TeacherDAO();
//		要将数据保存到数据库，或者使用transaction，或者使用session的fulsh方法
		Transaction transaction = TeacherDAO.getSession().beginTransaction();
		Teacher t=teaDAO.findById(id);
		transaction.commit();
		//System.out.println(t);放在主函数
		return t;
	}
	//选择指导的学生 增加被指导的人数
	public static void addInstructor_student(java.lang.Long id,java.lang.Long id2) {
//需要修改信息的学生学号，以及将要选择老师的工号
		//listTutor();在主函数写
		
		TeacherDAO teachDAO=new TeacherDAO();
		Transaction transaction = TeacherDAO.getSession().beginTransaction();
		Teacher t=teachDAO.findById(id);
		Set ss=t.getStudents();
		
		
//		要将数据保存到数据库，或者使用transaction，或者使用session的fulsh方法
		StudentDAO stuDAO=new StudentDAO();
		//Transaction transaction2 = StudentDAO.getSession().beginTransaction();
		Student s=stuDAO.findById(id2);
		s.setTutor(t);
		ss.add(s);
		t.setStudents(ss);
		teachDAO.update(t);
		stuDAO.update(s);
		
		transaction.commit();
		//transaction2.commit();
		
		
		//System.out.println("选择指导学生成功");
		
	}
	//删除所指导学生
	public static void deleteInstructor_student(java.lang.Long id,java.lang.Long id2) {
		//需要修改信息的学生学号，以及将要选择老师的工号
				//listTutor();在主函数写
				
				TeacherDAO teachDAO=new TeacherDAO();
				Transaction transaction = TeacherDAO.getSession().beginTransaction();
				Teacher t=teachDAO.findById(id);
				Set ss=t.getStudents();
				
				
//				要将数据保存到数据库，或者使用transaction，或者使用session的fulsh方法
				StudentDAO stuDAO=new StudentDAO();
				//Transaction transaction2 = StudentDAO.getSession().beginTransaction();
				Student s=stuDAO.findById(id2);
				s.setTutor(null);
				ss.remove(s);
				t.setStudents(ss);
				teachDAO.update(t);
				stuDAO.update(s);
				
				transaction.commit();
				//transaction2.commit();
				
				
				//System.out.println("选择指导学生成功");
				
			}
    //导师列表
	 private static void listTutors() {
	    	TeacherDAO stuDAO=new TeacherDAO();
	    	List stus = stuDAO.findAll();
	    	Iterator<?> StudentIterator = stus.iterator();
	    	while(StudentIterator.hasNext()){
	    		Teacher stu = (Teacher) StudentIterator.next();
	    		stu.show();
	    		//System.out.println("学生姓名:"+stu.getName()+"学号:"+stu.getId());
	    	}
	    }
   /* public static void listTuto2r() {

}*/
}